package gomz.pres.admin;

import gomz.GlobalRes;
import gomz.res.User;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * Diese Klasse steuert das UI der Benutzerverwaltung aller Benutzer. Es reagiert auf die Eingaben des Benutzers.
 * @author Murillo
 */
public class CAUseradministration {
	// ********************************************************************************
	// Variablen
	// ********************************************************************************
	private MVerwaltung model;
	private GUIAUseradministration view;
	private JFrame pWindow;
	
	//*********************************************************************************
	// Konstruktor
	// ********************************************************************************
	/**
	 * Konstruktor fuer den Controller fur die Benutzerverwaltung
	 */
	public CAUseradministration(JFrame pWindow, GUIAUseradministration view, MVerwaltung model) {
		this.model = model;
		this.view = view;
		this.pWindow = pWindow;
		
		addListener();
	}
	
	// ********************************************************************************
	// Listener
	// ********************************************************************************
	/**
	 * Diese Methode fuegt die Listener hinzu
	 */
	private void addListener(){
		//Buttons**********************************************************************
		//Loeschen
		view.getBtVdel().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doDel();
			}
		});
		
		//Speichern
		view.getBtVsave().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doSave();
			}
		});
		
		//Abbrechen
		view.getBtVcan().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doCancel();
			}
		});

		//Listen***********************************************************************
		//Benutzer auswaehlen
		view.getLiVlist().addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				//da das event vorkommt, wenn ein Feld deselektiert wird und wenn es seleltiert wird
				if (e.getValueIsAdjusting() == false){
					doUserChange();
				}
			}
		});
	}
	
	// ********************************************************************************
	// Methoden
	// ********************************************************************************
	/**
	 * Dies Methode loescht den in der Liste selektierten Benutzer
	 */
	public void doDel(){
		//Benutzer kann sich nicht selbst loeschen
		if (model.getAllUsers().get(view.getLiVlist().getSelectedIndex()).getId() == GlobalRes.getActivUser().getId()){
			JOptionPane.showMessageDialog(pWindow, "Sie koennen sich nicht selbst l\u00f6schen!", "Benutzer l\u00f6schen", JOptionPane.ERROR_MESSAGE);
		}
		else{
			model.delUser(view.getLiVlist().getSelectedIndex());
		}
	}
	
	/**
	 * Diese Methode speichert den selektierten Benutzer mit den Daten aus dem UI
	 */
	public void doSave(){
		Boolean re = false;
		
		//Benutzername und Passwort muessen angegeben werden
		if(view.getTfVuser().getText().equals("") || view.getPfVpw().getPassword().length == 0){
			JOptionPane.showMessageDialog(pWindow, "Es muss ein Benutzername und ein Passwort angegeben werden", "Benutzer speichern", JOptionPane.WARNING_MESSAGE);
		}
		//Der angemeldete Benutzer kann sich selbst die Adminrechte nicht entziehen
		else if(model.getUserUsed().getId() == GlobalRes.getActivUser().getId() && !view.getCbVadmin().isSelected()){
			JOptionPane.showMessageDialog(pWindow, "Sie koennen sich selbst die Adminrechte nicht entziehen", "Benutzer speichern", JOptionPane.WARNING_MESSAGE);
		}
		else{
			re = model.saveUser(model.getUserUsed().getId(), view.getTfVuser().getText(), view.getPfVpw().getPassword(),
					view.getTfVfirstname().getText(), view.getTfVlastname().getText(), view.getTfVemail().getText(),
					view.getCxVlang().getSelectedIndex(), view.getCbVadmin().isSelected(), view.getLiVlist().getSelectedIndex());
		
			if(!re){
				JOptionPane.showMessageDialog(pWindow, "Die Aenderungen konnten nicht gespeichert werden.", "Benutzer speichern", JOptionPane.ERROR_MESSAGE);
			}
			else{
				view.getLiVlist().setListData(model.getUserList());
			}
		}
	}
	
	/**
	 * Diese Methode setzt die vom Benutzer getaetigten eingaben zurueck
	 */
	public void doCancel(){
		fillData();
	}
	
	/**
	 * Diese Methode fuellt die Benutzerangaben des selektierten Benutzers in UI
	 */
	public void doUserChange(){
		fillData();
	}
	
	/**
	 * Diese Methode fuellt die Liste mit den auszuwaehlenden Benutzern
	 */
	public void fillListData(){
		view.getLiVlist().setListData(model.getUserList());
	}
	
	/**
	 * Diese Methode hohlt Benutzerdaten des ausgewaehlten Benutzers vom Server und fuellt sie ins UI und setzt ihn
	 * im Model als den aktuell zu bearbeitenden Benutzer
	 */
	public void fillData(){
		//Falls kein Element aus der Liste ausgewaehlt ist, das Element 0 selektieren.
		if (view.getLiVlist().getSelectedIndex() == -1){
			view.getLiVlist().setSelectedIndex(0);
		}
		else{
			//sobald die selektion der List geaendert wird, werden die Daten ins UI geschrieben
			User userToGet = model.loadUser(view.getLiVlist().getSelectedIndex());
			if (userToGet != null){
				model.setUserUsed(userToGet);
				
				view.getTfVuser().setText(model.getUserUsed().getUsername());
				view.getPfVpw().setText("");
				view.getTfVfirstname().setText(model.getUserUsed().getVorname());
				view.getTfVlastname().setText(model.getUserUsed().getNachname());
				view.getTfVemail().setText(model.getUserUsed().geteMail());
				view.getCxVlang().setSelectedIndex(model.getUserUsed().getLanguage()-1);
				view.getCbVadmin().setSelected(model.getUserUsed().isAdmin());
			}
			else{
				JOptionPane.showMessageDialog(pWindow, "Der Benutzer konnte nicht vom Server geladen werden.", "Benutzer anzeigen", JOptionPane.ERROR_MESSAGE);
			}
		}
	}

}
